import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Class Escenario
 * @author (Santos Miranda Luis Gerardo) 
 * @author (Lopez Rangel Arturo)
 */

public class Escenario extends World
{
    private Cubo cubito;//Variable tipo cubo usada para insertar las filas de cubos
    private Letrero letreroScore;//Muestra el letrero "SCORE"
    private Letrero letreroVida;//Muestra el letrero Vida
    private Puntos score;//Variable para los puntos del juego
    private int nivelpasado;//Variable auxiliar para guardar la variable nivel
    private boolean Bjuego;//Bandera booleana para validar el ingreso al juego
    private boolean Bayuda;//Bandera booleana para validar el ingreso a la ayuda
    private boolean Brecords;//Bandera booleana para validar el ingreso a los records
    private boolean Bcreditos;//Bandera booleana para validar el ingreso a los creditos
    private boolean GameOver;//Bandera booleana para mostrar el fin del juego
    private GreenfootSound Intro;//Variable para reproducir la musica al inicio
    private CanonA cnA;//Variable que dispara las balas tipo A
    private CanonB cnB;//Variable que dispara las balas tipo B
    private Nube nube;//Enemigo nube
    private Jugador Luigi;//Jugador Luigi
    private Vida vid;//Muestra las imagenes del nivel de vida
    private Piso cubito_piso;// Se utiliza par dibujar el piso del escenario
    private GreenfootImage fondo;//Imagen para el fondo
    private int opcionmenu;// Variable para las opciones del menu
    private Boton inicio;//Boton de inicio
    private Boton ayuda;//Boton de ayuda
    private Boton creditos;//Boton de creditos
    private Boton records;//Boton de records
    private Boton regresamenu;//Boton para el back
    private int i;//Variable usada para los for
    private int j;//Variable usada para los for
    private int nivel;//Variable para el nivel del juego
    private UserInfo info;//Variable para almacenar nombre y puntos

    /**
     * Constructor class escenario
     */
    public Escenario()
    {    
        super(11,13,40);
        Greenfoot.setSpeed(35);
        i=1;
        j=1;
        Intro=new GreenfootSound("entrada.mp3");
        Intro.setVolume(50);
        Bjuego=false;
        Bayuda=false;
        Bcreditos=false;
        GameOver=false;
        Luigi=new Jugador();
        opcionmenu=0;
        fondo=new GreenfootImage("menu.jpg");
        setBackground(fondo); 
        inicio= new Boton(1);
        ayuda= new Boton(2); 
        creditos= new Boton(3);
        regresamenu= new Boton(4);
        records=new Boton(5);
        ayuda.setImage("ayuda1.png");
        inicio.setImage("inicio1.png");
        creditos.setImage("creditos1.png");
        regresamenu.setImage("atras.png");
        records.setImage("records1.png");
        nivel=1;
    }

    /**
     *Method to eliminate hammer throwing the enemy
     */
    public void elimina_martillos()
    {
        java.util.Iterator<Martillo> ite;
        java.util.List<Martillo> TodosLosMartillos=getObjects(Martillo.class);
        if(!TodosLosMartillos.isEmpty())
        {
            ite=TodosLosMartillos.iterator();
            while(ite.hasNext())
            {
                Martillo variable=ite.next();
                if(variable.getY()==12)
                    super.removeObject(variable);
            }
        }

    }

    /**
     * Method that returns the level of the game
     */
    public int getNivel()
    {
        return nivel;
    }

    /**
     * Changes the level of the game to make a change of scenery
     */
    public void cambia_nivel(int unNivel)
    {
        nivel = unNivel;
    }

    /**
     *Add the cubes a position in the Y 
     */
    public void sube_cubos()
    {
        java.util.Iterator<Cubo> it;
        java.util.List<Cubo> TodosLosCubos=getObjects(Cubo.class);
        if(!TodosLosCubos.isEmpty())
        {
            it=TodosLosCubos.iterator();
            while(it.hasNext())
            {
                Cubo variable=it.next();
                if(variable.getX()<10)
                    variable.subeCubo();
            }
        }
    }

    /**
     * Displays the menu of the game with the respective radio buttons
     */
    public void menu()
    {
        setBackground(fondo);
        limpia_nivel();
        Intro.playLoop();
        super.addObject(inicio,4,3);
        super.addObject(ayuda,7,8);
        super.addObject(creditos,7,12);
        super.addObject(records,7,10);  
    }

    /**
     * Reduces the life of Luigi
     */
    public void quitale_vida()
    {
        vid.decrementaVida();
    }

    /**
     * Removes all objects from the stage to perform a level change
     */
    public void limpia_nivel()
    {
        java.util.List<Cubo> AllCubos=this.getObjects(Cubo.class);
        java.util.List<Puntos> AllPuntos=this.getObjects(Puntos.class);
        java.util.List<Letrero> AllLetreros=this.getObjects(Letrero.class);
        java.util.List<Vida> AllVidas=this.getObjects(Vida.class);
        java.util.List<Piso> AllPisos=this.getObjects(Piso.class);
        java.util.List<Jugador> AllJugador=this.getObjects(Jugador.class);
        java.util.List<Martillo> AllMartillos=this.getObjects(Martillo.class);
        java.util.List<Nube> Allnube=this.getObjects(Nube.class);
        java.util.List<BalaA> AllBalaA=this.getObjects(BalaA.class);
        java.util.List<BalaB> AllBalaB=this.getObjects(BalaB.class);
        java.util.List<CanonA> AllCanonA=this.getObjects(CanonA.class);
        java.util.List<CanonB> AllCanonB=this.getObjects(CanonB.class);
        java.util.List<Boton> AllBoton=this.getObjects(Boton.class);

        this.removeObjects(AllCubos);
        this.removeObjects(AllPuntos);
        this.removeObjects(AllLetreros);
        this.removeObjects(AllVidas);
        this.removeObjects(AllPisos);
        this.removeObjects(AllJugador); 
        this.removeObjects(AllMartillos);
        this.removeObjects(Allnube);
        this.removeObjects(AllBalaA);
        this.removeObjects(AllBalaB);
        this.removeObjects(AllCanonA);
        this.removeObjects(AllCanonB);
        this.removeObjects(AllBoton);
    }

    /**
     * Displays the end game
     */
    public void gameOver(int condicion)
    {
        this.actualizaPuntos();
        if(condicion==0)
        {
            setBackground("gameover.jpg");
            GreenfootSound gameOver= new GreenfootSound("endgame.wav");
            gameOver.setVolume(70);
            gameOver.play();
        }
        else
        {
            setBackground("gameover2.jpg");
            GreenfootSound gameOver= new GreenfootSound("gano.mp3");
            gameOver.setVolume(70);
            gameOver.play();
        }
        Greenfoot.delay(30);
        this.menu();
    }

    /**
     * Method Stage act
     */
    public void act()
    {   
        if(!Bjuego)
        {  if(!Bayuda)
                if(!Bcreditos)
                    if(!Brecords)
                        menu();
        }   
        else
        if(nivel!=0)
        {

            if(i++%25==0)
            {this.sube_cubos(); i=1;}

            if(j++%25==0)
            {
                this.inserta_fila(1); j=1;}

            if(nivel==2)
            {
                elimina_martillos();
            }

            if(nivel==3)
            {
                elimina_martillos();
                elimina_balas();
            }

            int limite=0;
            switch(nivel)
            {
                case 1: limite=1000;
                break;
                case 2: limite=2000;
                break;
                case 3: limite=3000;
                break;
            }
            if(score.getScore()>=limite)
            {
                nivelpasado=nivel;
                cambia_nivel(0);
                limpia_nivel();
                Greenfoot.delay(5);
                if(nivelpasado+1==2)
                {
                    this.prepara_Escenario2();
                    this.cambia_nivel(nivelpasado+1);
                }

                if(nivelpasado+1==3)
                {
                    this.prepara_Escenario3();
                    this.cambia_nivel(nivelpasado+1);
                }

                if(nivelpasado+1==4)
                {
                    gameOver(1);//1- GANO
                }
            }
        }
    }

    /**
     * Place the balls on stage
     */
    public void crea_canonA(int tipo_decanon)
    {
        cnA=new CanonA();
        if(tipo_decanon==0)
        { 
            Jugador aux;//Obtener a luigi
            java.util.List<Jugador> LLuigi=this.getObjects(Jugador.class);
            aux=LLuigi.get(0);
            this.addObject(cnA,8,aux.getY());
        }
    }

    /**
     * Removes the bullets that appear on stage
     */
    public void elimina_balas()
    {
        java.util.Iterator<BalaA> ite1;
        java.util.Iterator<BalaB> ite2;
        java.util.List<BalaA> TodasBalasA=getObjects(BalaA.class);
        if(!TodasBalasA.isEmpty())
        {
            ite1=TodasBalasA.iterator();
            while(ite1.hasNext())
            {
                BalaA variable=ite1.next();
                if(variable.getX()==0)
                    super.removeObject(variable);
            }
        }
        java.util.List<BalaB> TodasBalasB=getObjects(BalaB.class);
        if(!TodasBalasB.isEmpty())
        {
            ite2=TodasBalasB.iterator();
            while(ite2.hasNext())
            {
                BalaB variable=ite2.next();
                if(variable.getX()==8)
                    super.removeObject(variable);
            }
        }

    }

    /**
     * Display game credits
     */
    public void prepara_creditos()
    {
        Bcreditos=true;
        this.setBackground("creditoos.jpg");
        super.addObject(regresamenu,2,11);
    }

    /**
     * Displays help for the game
     */
    public void prepara_ayuda()
    {
        Bayuda=true;
        this.setBackground("ayudaa.jpg");
        super.addObject(regresamenu,2,11);
    }

    /**
     * Method for records
     */

    public void prepara_records()
    {
        Brecords=true;
        this.setBackground("recoords.jpg");
        java.util.List records=UserInfo.getTop(7);
        RecordUser usuario;
        if(records!=null)
        {
            for(int i=0; i<records.size(); i++)
            {
                info=(UserInfo)records.get(i);
                usuario=new RecordUser((i+1)+".- "+info.getUserName(),info.getScore());
                usuario.addToWorld(1+1*i,this);
            }
        }
        else
        {
            Letrero letr=new Letrero("Whitout Scores...");
            this.addObject(letr,1,1);
        }

        super.addObject(regresamenu,2,9);
    }
    
    /**
     * Method that updates the score
     */
    
    public void actualizaPuntos()
    {
        if(UserInfo.isStorageAvailable())
        {

           UserInfo info=UserInfo.getMyInfo();
           if(score.getScore()>info.getScore())
           {
               info.setScore(score.getScore());
           }
           info.store();
        }
    }
    
    /**
     * Removes the records
     */

    public void remueve_records()
    {
        java.util.List<Letrero> AllLetreros=this.getObjects(Letrero.class);
        super.removeObjects(AllLetreros);

    }

    /**
     * Removes the menu buttons
     */
    public void remueve_botones()
    {
        this.removeObject(inicio);
        this.removeObject(ayuda);
        this.removeObject(creditos);
        this.removeObject(regresamenu);
        this.removeObject(records);
    }

    /**
     * Prepare scenario for level 1
     */
    public void prepara_Escenario1()
    {
        Intro.stop();
        Bjuego=true;
        this.setBackground("Escenario.jpg");
        letreroVida=new Letrero("Vida:");
        super.addObject(letreroVida,9,10);
        vid=new Vida(5);
        super.addObject(vid,10,11);
        Luigi.setImage("luigi.png");
        super.addObject(Luigi,5,5);
        letreroScore=new Letrero("SCORE:");
        addObject(letreroScore,9,0);
        score= new Puntos(0);
        addObject(score,9,1);
        suelo();
        for(int j=1;j<4;j++)
        {
            this.inserta_fila(j);
        }
    }    

    /**
     * Prepare scenario for level 2
     */
    public void prepara_Escenario2()
    {
        int auxScore=this.getScore();
        Bjuego=true;
        this.setBackground("Escenario3.jpg");
        letreroVida=new Letrero("Vida:");
        super.addObject(letreroVida,9,10);
        vid=new Vida(5);
        super.addObject(vid,10,11);
        Luigi.setImage("luigi.png");
        super.addObject(Luigi,5,5);
        nube= new Nube();
        super.addObject(nube,2,0);
        letreroScore=new Letrero("SCORE:");
        addObject(letreroScore,9,0);
        score= new Puntos(auxScore);
        addObject(score,9,1);
        suelo();
        for(int j=1;j<5;j++)
        {
            this.inserta_fila(j);
        }
    }  

    /**
     * Prepare scenario for level 3
     */
    public void prepara_Escenario3()
    {
        Bjuego=true;
        int auxScore=this.getScore();
        this.setBackground("Escenario2.jpg");
        letreroVida=new Letrero("Vida:");
        super.addObject(letreroVida,9,10);
        vid=new Vida(5);
        super.addObject(vid,10,11);
        Luigi.setImage("luigi.png");
        super.addObject(Luigi,5,5);
        nube= new Nube();
        super.addObject(nube,2,0);
        cnA=new CanonA();
        super.addObject(cnA,8,Luigi.getY());
        cnB=new CanonB();
        super.addObject(cnB,0,Luigi.getY());

        letreroScore=new Letrero("SCORE:");
        addObject(letreroScore,9,0);
        score= new Puntos(auxScore);
        addObject(score,9,1);
        suelo();
        for(int j=1;j<5;j++)
        {
            this.inserta_fila(j);
        }

    }

    /**
     * Displays cubes that are destroying for the combos
     */
    public void dibujaCombo(int tipo, int cont)
    {

        if(cont!=0) 
        {
            Cubo cubo = new Cubo();
            switch(tipo)
            {
                case 6:cubo.setImage("negro.png");
                cubo.asignaColor(1);
                break;
                case 1:cubo.setImage("amarillo.png");
                cubo.asignaColor(2);
                break;
                case 2:cubo.setImage("verde.png");
                cubo.asignaColor(3);
                break;
                case 3:cubo.setImage("azul.png");
                cubo.asignaColor(4);
                break;
                case 4:cubo.setImage("rojo.png"); 
                cubo.asignaColor(5);
                break;
                case 5:cubo.setImage("morado.png");
                cubo.asignaColor(6);
                break;        
            }     
            super.addObject(cubo,10,9-cont);
        }
    }

    /**
     * Eliminates on-screen cube combo being done
     */
    public void borraCombo()
    {
        Actor cubo;
        for(int j=0;j<9;j++)
        {
            java.util.List<Actor> listaCubos = super.getObjectsAt(10, 9-j, Actor.class);
            if(!listaCubos.isEmpty())
            {
                cubo=(Actor) listaCubos.get(0);
                super.removeObject(cubo);  
            }
        }
    }

    /** 
     *Place the floor for levels
     */
    public void suelo()
    {
        for(int i=0;i<9;i++)
        { 
            cubito_piso=new Piso();
            super.addObject(cubito_piso,i,12);
        }
    }

    /**
     * Inserts rows of cubes
     */
    public void inserta_fila(int j)
    {
        for(int i=0;i<9;i++)
        { 
            cubito=new Cubo();
            int color=Greenfoot.getRandomNumber(6);
            switch(color)
            {
                case 0:cubito.setImage("amarillo.png");
                cubito.asignaColor(1);
                break;
                case 1:cubito.setImage("verde.png");
                cubito.asignaColor(2);
                break;
                case 2:cubito.setImage("azul.png");
                cubito.asignaColor(3);
                break;
                case 3:cubito.setImage("rojo.png"); 
                cubito.asignaColor(4);
                break;
                case 4:cubito.setImage("morado.png");
                cubito.asignaColor(5);
                break;
                case 5:cubito.setImage("negro.png");
                cubito.asignaColor(6);
                break;        
            }
            super.addObject(cubito,i,12-j);
        }
    }

    /**
     * Increases points
     */
    public void aumentaPuntos()
    {
        score.aumenta();
    }

    /**
     * Returns the score
     */
    public int getScore()
    {
        int pts=score.getScore();
        return (pts);
    }
}